package proxy2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 宋鑫宇
 * @version 1.0
 */
public class UserAgentProxy {
    //1.通过一个静态方法，为用户业务对象返回一个代理对象
    //通过泛型可以为任意接口的对象做代理
    public static <T> T userProxy(T u) {
        return (T) Proxy.newProxyInstance(u.getClass().getClassLoader(),
                u.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long starTime = System.currentTimeMillis();
                        //让UserServiceImpl类去执行方法
                        Object invoke = method.invoke(u, args);
                        long endTime = System.currentTimeMillis();
                        System.out.println(method.getName() + "方法耗时" + (endTime - starTime) / 1000.00 + "秒");
                        return invoke;
                    }
                });
    }
}
